package com.ruoyi.common.core.domain;
import com.ruoyi.common.constant.HttpStatus;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

/**
 * 贾、宇、璇。响应体
 * 统一响应结果封装（泛型版）
 * 用于接口统一返回格式：{code:状态码, msg:消息, data:数据}
 */
@ApiModel(description = "统一响应体：包含状态码、响应消息和业务数据")
@Getter
@Setter
@ToString
public class JYXResult<T> implements Serializable {

    private static final long serialVersionUID = 6773492363335860129L;

    /**
     * 响应状态码
     * <p>200=成功，400=警告，500=错误（具体值参考{@link HttpStatus}）</p>
     */
    @ApiModelProperty(
            value = "响应状态码",
            required = true,
            example = "200",
            allowableValues = "200, 400, 500",
            notes = "200=成功，400=警告，500=错误（其他码值见业务定义）"
    )
    private int code;

    /**
     * 响应消息
     * <p>成功时为"操作成功"，失败时为具体错误提示</p>
     */
    @ApiModelProperty(
            value = "响应消息（成功/错误提示文本）",
            required = true,
            example = "操作成功"
    )
    private String msg;

    /**
     * 业务数据
     * <p>成功时返回具体业务对象/列表，失败时可能为null</p>
     */
    @ApiModelProperty(
            value = "响应数据（动态类型，可为实体、列表、分页数据等）",
            required = false,
            notes = "成功时返回业务数据，失败时可能为null"
    )
    private T data;


    // ==================== 构造方法（私有，强制通过静态工厂方法创建） ====================
    private JYXResult() {
    }

    private JYXResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    private JYXResult(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }


    // ==================== 静态工厂方法（统一创建响应对象，规范状态码） ====================

    /**
     * 成功响应（无数据）
     */
    public static <T> JYXResult<T> success() {
        return new JYXResult<>(HttpStatus.SUCCESS, "操作成功");
    }

    /**
     * 成功响应（带数据）
     */
    public static <T> JYXResult<T> success(T data) {
        return new JYXResult<>(HttpStatus.SUCCESS, "操作成功", data);
    }

    /**
     * 成功响应（自定义消息）
     */
    public static <T> JYXResult<T> success(String msg) {
        return new JYXResult<>(HttpStatus.SUCCESS, msg);
    }

    /**
     * 成功响应（自定义消息+数据）
     */
    public static <T> JYXResult<T> success(String msg, T data) {
        return new JYXResult<>(HttpStatus.SUCCESS, msg, data);
    }

    /**
     * 警告响应（无数据）
     */
    public static <T> JYXResult<T> warn(String msg) {
        return new JYXResult<>(HttpStatus.WARN, msg);
    }

    /**
     * 警告响应（带数据）
     */
    public static <T> JYXResult<T> warn(String msg, T data) {
        return new JYXResult<>(HttpStatus.WARN, msg, data);
    }

    /**
     * 错误响应（默认消息）
     */
    public static <T> JYXResult<T> error() {
        return new JYXResult<>(HttpStatus.ERROR, "操作失败");
    }

    /**
     * 错误响应（自定义消息）
     */
    public static <T> JYXResult<T> error(String msg) {
        return new JYXResult<>(HttpStatus.ERROR, msg);
    }

    /**
     * 错误响应（自定义消息+数据）
     */
    public static <T> JYXResult<T> error(String msg, T data) {
        return new JYXResult<>(HttpStatus.ERROR, msg, data);
    }

    /**
     * 错误响应（自定义状态码+消息）
     */
    public static <T> JYXResult<T> error(int code, String msg) {
        return new JYXResult<>(code, msg);
    }


    // ==================== 状态判断工具方法 ====================

    /**
     * 是否为成功响应
     */
    public boolean isSuccess() {
        return code == HttpStatus.SUCCESS;
    }

    /**
     * 是否为警告响应
     */
    public boolean isWarn() {
        return code == HttpStatus.WARN;
    }

    /**
     * 是否为错误响应
     */
    public boolean isError() {
        return code == HttpStatus.ERROR;
    }
}